<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 注意：dp[i]是第i天，那么prices[i-1]才是那个第i天的价值
      ①初始化dp数组和下标含义：总共买卖两次，因此定义四个状态
      dp[0][0]什么都不做
      dp[i][1]表示第i天第一次持有股票的最大收益
      dp[i][2]表示第i天第一次不持有股票的最大收益
      dp[i][3]表示第i天第二次持有股票的最大收益
      dp[i][4]表示第i天第二次不持有股票的最大收益
      dp[i][0]表示初始状态，什么也不做 dp[i][0]=0

      ②状态转移方程：
      如果前一天不持有股票或者前一天已经持有股票了，dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i-1])

      当天第一次售出股票或者前一天售出dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]+prices[i-1])

      前一天第二次不持有股票，或者前一天第二次持有股票 dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]-prices[i-1])

      dp[i][4]=Math.max(dp[i-1][4],dp[i-1][3]+prices[i-1])
      
      */
      var maxProfit = function (prices) {
        let dp = new Array(prices.length + 1).fill().map(() => new Array(5).fill(0))
        dp[1][1] = -prices[0]
        dp[1][3] = -prices[0]
        for (let i = 2; i <= prices.length; i++) {
          dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i - 1])
          dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i - 1])
          dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i - 1])
          dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i - 1])
        }
        return dp[dp.length - 1][4]
      }
      maxProfit([1, 2])
    </script>
  </body>
</html>
